// 2_5_test_leetcode.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
#include<string>

//仅反转字符串中的字母

//class Solution {
//public:
//    string reverseOnlyLetters(string s) {
//        string::iterator it1 = s.begin();
//        string::iterator it2 = s.end() - 1;
//        while (it1 < it2)
//        {
//            while (!isalpha(*it1) && it1 < it2)
//                it1++;
//            while (!isalpha(*it2) && it1 < it2)
//                it2--;
//            swap(*it1, *it2);
//            it1++;
//            it2--;
//        }
//        return s;
//    }
//};

//int main()
//{
//    string s = "a - bC - dEf - ghIj";
//    string::iterator it1 = s.begin();
//    string::iterator it2 = s.end() - 1;
//    while (it1 < it2)
//    {
//        if ((('a' <= *it1 && *it1 <= 'z') || ('A' <= *it1 && *it1 <= 'Z')) && (('a' <= *it2 && *it2 <= 'z') || ('A' <= *it2 && *it2 <= 'Z')))
//        {
//            swap(*it1, *it2);
//            it1++;
//            it2--;
//        }
//        else if (('Z' < *it1 && *it1 < 'a') || 'z' < *it1 || *it1 < 'A')
//        {
//            it1++;
//        }
//        else if (('Z' < *it2 < 'a' && *it2 < 'a') || 'z' < *it2 || *it2 < 'A')
//        {
//            it2--;
//        }
//    }
//
//    cout << s << endl;
//    return 0;
//}

//找出字符串中第一次出现的字母
//class Solution {
//public:
//    int firstUniqChar(string s) {
//        int a[256] = { 0 };
//        for (size_t i = 0; i < s.size(); i++)
//        {
//            int num = s[i];
//            a[s[i]]++;
//        }
//
//        for (size_t i = 0; i < s.size(); i++)
//        {
//            if (1 == a[s[i]])
//            {
//                return i;
//            }
//        }
//
//        return  -1;
//
//    }
//};


//int main()
//{
//	string s;
//	char c = '1';
//	char b = '9';
//	char a = c - '0' + b;
//	cout << (int)b << endl;
//	if (a > '9')
//	{
//		
//	}
//
//	cout << s << endl;
//
//
//	return 0;
//}
class Solution {
public:
    string addStrings(string num1, string num2) {
        string s;
        string::reverse_iterator it1 = num1.rbegin();
        string::reverse_iterator it2 = num2.rbegin();
        s.reserve(max(num1.size(), num2.size()) + 1);
        int flag = 0;   //进位标志位

        while (it1 < num1.rend() || it2 < num2.rend())
        {
            char c1 = it1 < num1.rend() ? *it1 : '0';
            char c2 = it2 < num2.rend() ? *it2 : '0';
            char ret = c1 + c2 - '0' + flag;
            if (ret > '9')
            {
                ret -= 10;
                flag = 1;
            }
            else
            {
                flag = 0;
            }
            s.push_back(ret);
            it1++;
            it2++;
        }
        if (flag == 1)
        {
            s.push_back('1');
        }
        reverse(s.begin(), s.end());
        return s;
    }
};



int main()
{
    string num1 = "237";
    string num2 = "284";
    string s;
    string::reverse_iterator it1 = num1.rbegin();
    string::reverse_iterator it2 = num2.rbegin();
    int flag = 0;
    while (it1 < num1.rend() && it2 < num2.rend())
    {
        char a = *it1 + *it2 - '0'+flag;
        if (a > '9')
        {
             a -= 10;

            flag = 1;
        }
        else
        {
            flag = 0;
        }
        s.push_back(a);
        it1++;
        it2++;
    }
    //判断是那边走完了
    while (it1 < num1.rend())
    {
        char c = *it1 + flag;
        if (c > '9')
        {
            c -= 10;
            flag = 1;
        }
        else
        {
            flag = 0;
        }
        s.push_back(c);
        it1++;
    }
    while (it2 < num2.rend())
    {
        char c = *it2+flag;
        if (c>'9')
        {
            c -= 10;
            flag = 1;
        }
        else
        {
            flag = 0;
        }
        s.push_back(c);
        it2++;
    }
   
    //如果此时同时走完，并且flag=1，还得给最高位添加个1
    while (it1 >= num1.rend() && it2 >= num2.rend() && flag == 1)
    {
        s.push_back('1');
        flag = 0;
    }
    //逆置s
    reverse(s.begin(), s.end());
    cout << s << endl;
    return 0;
}